МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
Кафедра САП
Звіт
до лабораторної роботи № 11
Множинне спадкування
з курсу “Проблемно-орієнтоване програмування”
для студентів спеціальності "Комп’ютерні системи проектування"
Львів 2013
1. МЕТА РОБОТИ
Метою даної роботи є ознайомлення з принципами множинного спадкування у обєктно-орієнтованій мові програмування C++.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
Множинне спадкування
Похідний клас може одночасно спадковувати властивості декількох базових класів.
Конструктори, деструктори й спадкування
У зв'язку зі спадкуванням виникають два питання, що стосуються конструкторів і деструкторів. По-перше, коли викликаються конструктори й деструктори базового й похідного класів? По-друге, як передаються параметри конструкторів базового класу? Відповіді на ці питання описано нижче.
Коли викликаються конструктори й деструктори
Базовий і похідний клас можуть містити декілька конструкторів і деструктор. Отже, дуже важливо правильно розуміти, у якому порядку вони викликаються при створенні й знищенні об'єктів похідного класу.
При створенні об'єкта похідного класу спочатку викликається конструктор базового класу, а потім - похідного. При знищенні об'єкта похідного класу спочатку викликається деструктор похідного класу, а потім - базового. Інакше кажучи, конструктори викликаються в ієрархічному порядку, а деструктори - у зворотному.
Це цілком природно. Оскільки базовий клас не має ніякої інформації про похідні класи, ініціалізація його об'єктів повинна виконуватися до ініціалізації будь-якого об'єкта похідного класу. Отже, конструктор базового класу повинен викликатися першим.
Цілком очевидно, що деструктори повинні викликатися у зворотному порядку. Оскільки похідний клас успадковує властивості базового, знищення об'єкта базового класу викличе знищення об'єкта похідного класу. Отже, деструктор похідного класу повинен викликатися до повного знищення об'єкта.
При ієрархічному спадкуванні (коли похідний клас стає базовим для свого спадкоємця) застосовується наступне правило: конструктори викликаються в ієрархічному порядку, а деструктори - у зворотному.
Це правило застосовне й до множинного спадкування.
Передача параметрів конструкторові базового класу
Дотепер ми розглядали конструктори, що не мають аргументів. Якщо конструктор похідного класу повинен одержувати кілька параметрів, варто просто використовувати стандартну синтаксичну форму конструктора з параметрами. Однак виникає питання, яким чином передаються аргументи конструкторові базового класу? Для цього застосовується розширена форма оголошення конструктора похідного класу, що дозволяє передавати аргументи декільком конструкторам одного або декількох базових класів. Загальна форма цієї синтаксичної конструкції така.
конструктор_похідного_класу (список_аргументів) :
bаве1 (список_аргументів),
bаsе2(список_аргументів),
. . .
bаseN(список_аргументів)
{
// Тіло конструктора похідного класу
}
Тут параметри base1 - baseN є іменами базових класів. Зверніть увагу на те, що оголошення конструктора похідного класу відділяється двокрапкою від специфікацій базових класів, які, у свою чергу, розділяються комами.
Підкреслимо, що аргументи конструктора базового класу передаються за допомогою аргументів конструктора похідного класу. Отже, навіть якщо конструктор похідного класу не має власних аргументів, його оголошення повинне містити аргументи конструкторів базових класів. У цьому випадку аргументи, передані конструкторові похідного класу, просто переправляються конструкторам базових класів.
Конструктор похідного класу може довільно використовувати всі параметри, зазначені в його оголошенні, навіть якщо вони передаються конструкторам базового класу. Інакше кажучи, передача параметрів конструкторам базових класів не виключає їхнього використання всередині похідного класу.
Передаючи параметри конструкторам базових класів, варто мати на увазі, що як аргумент можуть використовуватися будь-які допустимі вирази, ...